package com.Lemon.Zhkuhealth.provider.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.Lemon.Zhkuhealh.api.service.IMemberService;
import com.Lemon.Zhkuhealth.common.pojo.entity.Member;
import com.Lemon.Zhkuhealth.common.util.PageResult;
import com.Lemon.Zhkuhealth.common.util.QueryPageBean;
import com.Lemon.Zhkuhealth.provider.mapper.MemberMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;

/**
 * 会员服务实现类
 */
@DubboService // 标记这是一个 Dubbo 服务
@RequiredArgsConstructor // 使用 Lombok 生成构造器，注入 final 字段
@Slf4j // 使用 Lombok 生成日志对象
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements IMemberService {

    private final MemberMapper memberMapper; // MyBatis-Plus 提供的 Mapper

    @Override
    public PageResult<Member> findPage(QueryPageBean queryPageBean) {
        log.info("查询会员列表，当前页: {}, 每页大小: {}, 查询条件: {}",
                queryPageBean.getCurrentPage(), queryPageBean.getPageSize(), queryPageBean.getQueryString());

        Page<Member> page = new Page<>(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        LambdaQueryWrapper<Member> queryWrapper = new LambdaQueryWrapper<>();

        // 根据前端的搜索条件进行模糊查询 (姓名、手机号)
        if (StringUtils.hasText(queryPageBean.getQueryString())) {
            queryWrapper.like(Member::getName, queryPageBean.getQueryString())
                        .or()
                        .like(Member::getPhoneNumber, queryPageBean.getQueryString());
        }
        // 对于性别，MemberArchives.vue中是单独的select，这里可以根据实际需求看queryPageBean是否支持
        // 如果queryPageBean中包含sex字段，可以这样添加
        // if (StringUtils.hasText(queryPageBean.getSex())) {
        //     queryWrapper.eq(Member::getSex, queryPageBean.getSex());
        // }

        // 默认按ID降序排序
        queryWrapper.orderByDesc(Member::getId);

        Page<Member> memberPage = memberMapper.selectPage(page, queryWrapper);

        return new PageResult<>(memberPage.getTotal(), memberPage.getRecords());
    }

    @Override
    @Transactional // 确保事务一致性
    public void add(Member member) {
        log.info("新增会员: {}", member);
        // 完善会员信息，例如设置注册时间
        if (member.getRegTime() == null) {
            member.setRegTime(LocalDateTime.now());
        }
        // 密码可以根据需要加密
        // if (StringUtils.hasText(member.getPassword())) {
        //     member.setPassword(BCrypt.hashpw(member.getPassword(), BCrypt.gensalt())); // 假设使用BCrypt加密
        // }
        memberMapper.insert(member);
        log.info("会员新增成功，ID: {}", member.getId());
    }

    @Override
    public Member findById(Integer id) {
        log.info("根据ID查询会员: {}", id);
        return memberMapper.selectById(id);
    }

    @Override
    public Member getMemberById(Integer id) {
        // 根据MemberArchives.vue中的需求，此方法返回的Member对象中需要包含档案号和手机号
        // findById已经可以满足，如果后续需要更复杂的关联查询，可以在mapper中自定义SQL
        log.info("根据ID查询会员档案信息: {}", id);
        return memberMapper.selectById(id);
    }


    @Override
    @Transactional
    public void edit(Member member) {
        log.info("更新会员信息: {}", member);
        // 可以在这里添加业务逻辑，例如不允许修改身份证号等
        // 如果密码也需要更新，可能需要判断是否传入了新密码并加密
        memberMapper.updateById(member);
        log.info("会员更新成功，ID: {}", member.getId());
    }

    @Override
    @Transactional
    public void deleteById(Integer id) {
        log.info("删除会员，ID: {}", id);
        // 物理删除，如果Member实体中配置了@TableLogic，则会执行逻辑删除
        memberMapper.deleteById(id);
        log.info("会员删除成功，ID: {}", id);
    }

    @Override
    public Member findByPhoneNumber(String phoneNumber) {
        log.info("根据手机号查询会员: {}", phoneNumber);
        LambdaQueryWrapper<Member> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Member::getPhoneNumber, phoneNumber);
        return memberMapper.selectOne(queryWrapper);
    }
}